"""
在 Elasticsearch 的 bulk操作中，_op_type（operation type，操作类型）是用来指定当前这条操作要执行什么类型的动作
比如是插入（index）、创建（create）、更新（update）、还是删除（delete）文档。
默认情况下，如果你在 bulk 的每项操作中只提供 _index和 _source
那么它的 _op_type默认就是 "index"，也就是 插入或替换文档。
但 Elasticsearch 的 bulk API 允许你显式地通过 _op_type字段来指定不同的操作类型。

操作类型 (_op_type)

index(默认)
插入一条文档，如果文档 ID 已存在，则 覆盖（替换）该文档

create
仅当文档不存在时插入，如果文档 ID 已存在，则操作失败

update
更新已有文档的部分字段，不能用于插入新文档（除非配合 doc_as_upsert=True）

delete
删除指定 ID 的文档，不需要 _source

"""
from elasticsearch import Elasticsearch, helpers

es = Elasticsearch([{'host': '39.108.176.217', 'port': 9200}])

index_name = "my_index"

actions = [
    # 1. index（插入/替换）_id=1
    {
        "_op_type": "index",
        "_index": index_name,
        "_id": 1,
        "_source": {"title": "Index 操作", "content": "替换或插入ID=1的文档", "views": 100}
    },
    # 2. create（仅当不存在时插入）_id=2
    {
        "_op_type": "create",
        "_index": index_name,
        "_id": 22,
        "_source": {"title": "Create 操作", "content": "仅当ID=22不存在时插入", "views": 200}
    },
    # 3. update（更新文档字段）_id=1
    {
        "_op_type": "update",
        "_index": index_name,
        "_id": "jp5CjpkBEOKFsH1CI9Xx",
        "doc": {"name": "xxp"}  # 只更新 author 字段
    },
    # 4. update + doc_as_upsert（如果不存在则插入）
    {
        "_op_type": "update",
        "_index": index_name,
        "_id": 999,  # 假如不存在
        "doc": {"title": "通过 upsert 插入的新文档", "views": 1},
        "doc_as_upsert": True
    },
    # 5. delete（删除文档）_id=2
    {
        "_op_type": "delete",
        "_index": index_name,
        "_id": "jJ5CjpkBEOKFsH1CI9Xx"
    }
]

# 执行批量操作
success, failed = helpers.bulk(es, actions)

print(f"成功操作数: {success}")
if failed:
    print(f"失败操作数: {len(failed)}，失败详情: {failed}")